package core;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class Server {

	private int numeroConnessioni;
	private int port;
	private String saveDir;
 
	public Server () {}
	
	public void setServer (int numConnessioni, int porta, String sD) {
		this.numeroConnessioni = numConnessioni;
		this.port = porta;
		this.saveDir = sD.replace("\\", "//");
		
		this.listen();
	}
	
	private void listen() {
		ServerSocket serverSocket;
		try {
			serverSocket = new ServerSocket(port);
			System.out.println("Server avviato sulla porta: " + serverSocket);
			System.out.println("Server in attesa di connessioni ...");
			
			//Creo un pool di thread concorrenti
		    ExecutorService executor = Executors.newFixedThreadPool(numeroConnessioni);
			
			/*
			 * Ciclo infinito per accettare per sempre connessioni
			 * 
			 * Creo ed eseguo il thread per questa connessione cosi il
			 * ciclo continua e rimane in attesa di nuove connessioni
			 */
		    int numero = 1;
			while (true) {
				Socket socket = serverSocket.accept();
				
				try {
			        executor.execute(new ReceiverManager(socket, saveDir, numero));
			        numero++;
			    }catch(Exception e){
			    	executor.shutdown();
			    }
	        }
		} catch (IOException e) {
			System.out.println("Eccezione all'avvio del server: "+e.getMessage());
		    System.exit(-1);
		}
	}
}
